home *** CD-ROM | disk | FTP | other *** search
- /*
-
- SolveRubiksCube
- Copyright (c) 1994 J Robert Boonstra
-
- */
-
- #pragma options(honor_register,assign_registers)
-
- #include "rubik.h"
- #include "transform.h"
-
- Boolean SolveTopCorners(register RubiksCube *rub)
- {
- short loopCount;
-
- /**********************************************************
- *
- * STEP 2: Put the corner cubes in the top layer into
- * the proper position and orientation.
- * Loop until all are correct.
- *
- *********************************************************/
- loopCount=0;
- do {
- if (++loopCount>8) return false;
- if (DRF_F == U) {
- if (DRF_R == F) {
- if (DRF_D == R) { goto URF1;
- } else if (DRF_D == L) { D3; goto ULF1;
- }
- } else if (DRF_R == R) {
- if (DRF_D == F) { goto URF1;
- } else if (DRF_D == B) { D1; goto URB1;
- }
- } else if (DRF_R == B) {
- if (DRF_D == R) { D1; goto URB1;
- } else if (DRF_D == L) { D2; goto ULB1;
- }
- } else if (DRF_R == L) {
- if (DRF_D == F) { D3; goto ULF1;
- } else if (DRF_D == B) { D2; goto ULB1;
- }
- }
- } else if (DRF_R == U) {
- if (DRF_F == F) {
- if (DRF_D == R) { goto URF1;
- } else if (DRF_D == L) { D3; goto ULF1;
- }
- } else if (DRF_F == R) {
- if (DRF_D == F) { goto URF1;
- } else if (DRF_D == B) { D1; goto URB1;
- }
- } else if (DRF_F == B) {
- if (DRF_D == R) { D1; goto URB1;
- } else if (DRF_D == L) { D2; goto ULB1;
- }
- } else if (DRF_F == L) {
- if (DRF_D == F) { D3; goto ULF1;
- } else if (DRF_D == B) { D2; goto ULB1;
- }
- }
- } else if (DRF_D == U) {
- if (DRF_F == F) {
- if (DRF_R == R) { goto URF1;
- } else if (DRF_R == L) { D3; goto ULF1;
- }
- } else if (DRF_F == R) {
- if (DRF_R == F) { goto URF1;
- } else if (DRF_R == B) { D1; goto URB1;
- }
- } else if (DRF_F == B) {
- if (DRF_R == R) { D1; goto URB1;
- } else if (DRF_R == L) { D2; goto ULB1;
- }
- } else if (DRF_F == L) {
- if (DRF_R == F) { D3; goto ULF1;
- } else if (DRF_R == B) { D2; goto ULB1;
- }
- }
- }
- goto corner2;
- URF1: if (DRF_F == U) { F1D1F3;
- } else if (DRF_R == U) { R3D3R1;
- } else if (DRF_D == U) { R3D1R1D2R3D3R1;
- }
- goto corner2;
- URB1: if (DRB_R == U) { R1D1R3;
- } else if (DRB_B == U) { B3D3B1;
- } else if (DRB_D == U) { B3D1B1D2B3D3B1;
- }
- goto corner2;
- ULB1: if (DLB_B == U) { B1D1B3;
- } else if (DLB_L == U) { L3D3L1;
- } else if (DLB_D == U) { L3D1L1D2L3D3L1;
- }
- goto corner2;
- ULF1: if (DLF_L == U) { L1D1L3;
- } else if (DLF_F == U) { F3D3F1;
- } else if (DLF_D == U) { F3D1F1D2F3D3F1;
- }
- corner2: ;
-
- if (DRB_R == U) {
- if (DRB_B == F) {
- if (DRB_D == R) { D3; goto URF2;
- } else if (DRB_D == L) { D2; goto ULF2;
- }
- } else if (DRB_B == R) {
- if (DRB_D == F) { D3; goto URF2;
- } else if (DRB_D == B) { goto URB2;
- }
- } else if (DRB_B == B) {
- if (DRB_D == R) { goto URB2;
- } else if (DRB_D == L) { D1; goto ULB2;
- }
- } else if (DRB_B == L) {
- if (DRB_D == F) { D2; goto ULF2;
- } else if (DRB_D == B) { D1; goto ULB2;
- }
- }
- } else if (DRB_B == U) {
- if (DRB_R == F) {
- if (DRB_D == R) { D3; goto URF2;
- } else if (DRB_D == L) { D2; goto ULF2;
- }
- } else if (DRB_R == R) {
- if (DRB_D == F) { D3; goto URF2;
- } else if (DRB_D == B) { goto URB2;
- }
- } else if (DRB_R == B) {
- if (DRB_D == R) { goto URB2;
- } else if (DRB_D == L) { D1; goto ULB2;
- }
- } else if (DRB_R == L) {
- if (DRB_D == F) { D2; goto ULF2;
- } else if (DRB_D == B) { D1; goto ULB2;
- }
- }
- } else if (DRB_D == U) {
- if (DRB_R == F) {
- if (DRB_B == R) { D3; goto URF2;
- } else if (DRB_B == L) { D2; goto ULF2;
- }
- } else if (DRB_R == R) {
- if (DRB_B == F) { D3; goto URF2;
- } else if (DRB_B == B) { goto URB2;
- }
- } else if (DRB_R == B) {
- if (DRB_B == R) { goto URB2;
- } else if (DRB_B == L) { D1; goto ULB2;
- }
- } else if (DRB_R == L) {
- if (DRB_B == F) { D2; goto ULF2;
- } else if (DRB_B == B) { D1; goto ULB2;
- }
- }
- }
- goto corner3;
- URF2: if (DRF_F == U) { F1D1F3;
- } else if (DRF_R == U) { R3D3R1;
- } else if (DRF_D == U) { R3D1R1D2R3D3R1;
- }
- goto corner3;
- URB2: if (DRB_R == U) { R1D1R3;
- } else if (DRB_B == U) { B3D3B1;
- } else if (DRB_D == U) { B3D1B1D2B3D3B1;
- }
- goto corner3;
- ULB2: if (DLB_B == U) { B1D1B3;
- } else if (DLB_L == U) { L3D3L1;
- } else if (DLB_D == U) { L3D1L1D2L3D3L1;
- }
- goto corner3;
- ULF2: if (DLF_L == U) { L1D1L3;
- } else if (DLF_F == U) { F3D3F1;
- } else if (DLF_D == U) { F3D1F1D2F3D3F1;
- }
- corner3: ;
- if (DLB_B == U) {
- if (DLB_L == F) {
- if (DLB_D == R) { D2; goto URF3;
- } else if (DLB_D == L) { D1; goto ULF3;
- }
- } else if (DLB_L == R) {
- if (DLB_D == F) { D2; goto URF3;
- } else if (DLB_D == B) { D3; goto URB3;
- }
- } else if (DLB_L == B) {
- if (DLB_D == R) { D3; goto URB3;
- } else if (DLB_D == L) { goto ULB3;
- }
- } else if (DLB_L == L) {
- if (DLB_D == F) { D1; goto ULF3;
- } else if (DLB_D == B) { goto ULB3;
- }
- }
- } else if (DLB_L == U) {
- if (DLB_B == F) {
- if (DLB_D == R) { D2; goto URF3;
- } else if (DLB_D == L) { D1; goto ULF3;
- }
- } else if (DLB_B == R) {
- if (DLB_D == F) { D2; goto URF3;
- } else if (DLB_D == B) { D3; goto URB3;
- }
- } else if (DLB_B == B) {
- if (DLB_D == R) { D3; goto URB3;
- } else if (DLB_D == L) { goto ULB3;
- }
- } else if (DLB_B == L) {
- if (DLB_D == F) { D1; goto ULF3;
- } else if (DLB_D == B) { goto ULB3;
- }
- }
- } else if (DLB_D == U) {
- if (DLB_B == F) {
- if (DLB_L == R) { D2; goto URF3;
- } else if (DLB_L == L) { D1; goto ULF3;
- }
- } else if (DLB_B == R) {
- if (DLB_L == F) { D2; goto URF3;
- } else if (DLB_L == B) { D3; goto URB3;
- }
- } else if (DLB_B == B) {
- if (DLB_L == R) { D3; goto URB3;
- } else if (DLB_L == L) { goto ULB3;
- }
- } else if (DLB_B == L) {
- if (DLB_L == F) { D1; goto ULF3;
- } else if (DLB_L == B) { goto ULB3;
- }
- }
- }
- goto corner4;
- URF3: if (DRF_F == U) { F1D1F3;
- } else if (DRF_R == U) { R3D3R1;
- } else if (DRF_D == U) { R3D1R1D2R3D3R1;
- }
- goto corner4;
- URB3: if (DRB_R == U) { R1D1R3;
- } else if (DRB_B == U) { B3D3B1;
- } else if (DRB_D == U) { B3D1B1D2B3D3B1;
- }
- goto corner4;
- ULB3: if (DLB_B == U) { B1D1B3;
- } else if (DLB_L == U) { L3D3L1;
- } else if (DLB_D == U) { L3D1L1D2L3D3L1;
- }
- goto corner4;
- ULF3: if (DLF_L == U) { L1D1L3;
- } else if (DLF_F == U) { F3D3F1;
- } else if (DLF_D == U) { F3D1F1D2F3D3F1;
- }
- corner4: ;
- if (DLF_L == U) {
- if (DLF_F == F) {
- if (DLF_D == R) { D1; goto URF4;
- } else if (DLF_D == L) { goto ULF4;
- }
- } else if (DLF_F == R) {
- if (DLF_D == F) { D1; goto URF4;
- } else if (DLF_D == B) { D2; goto URB4;
- }
- } else if (DLF_F == B) {
- if (DLF_D == R) { D2; goto URB4;
- } else if (DLF_D == L) { D3; goto ULB4;
- }
- } else if (DLF_F == L) {
- if (DLF_D == F) { goto ULF4;
- } else if (DLF_D == B) { D3; goto ULB4;
- }
- }
- } else if (DLF_F == U) {
- if (DLF_L == F) {
- if (DLF_D == R) { D1; goto URF4;
- } else if (DLF_D == L) { goto ULF4;
- }
- } else if (DLF_L == R) {
- if (DLF_D == F) { D1; goto URF4;
- } else if (DLF_D == B) { D2; goto URB4;
- }
- } else if (DLF_L == B) {
- if (DLF_D == R) { D2; goto URB4;
- } else if (DLF_D == L) { D3; goto ULB4;
- }
- } else if (DLF_L == L) {
- if (DLF_D == F) { goto ULF4;
- } else if (DLF_D == B) { D3; goto ULB4;
- }
- }
- } else if (DLF_D == U) {
- if (DLF_L == F) {
- if (DLF_F == R) { D1; goto URF4;
- } else if (DLF_F == L) { goto ULF4;
- }
- } else if (DLF_L == R) {
- if (DLF_F == F) { D1; goto URF4;
- } else if (DLF_F == B) { D2; goto URB4;
- }
- } else if (DLF_L == B) {
- if (DLF_F == R) { D2; goto URB4;
- } else if (DLF_F == L) { D3; goto ULB4;
- }
- } else if (DLF_L == L) {
- if (DLF_F == F) { goto ULF4;
- } else if (DLF_F == B) { D3; goto ULB4;
- }
- }
- }
- goto cornerDone;
- URF4: if (DRF_F == U) { F1D1F3;
- } else if (DRF_R == U) { R3D3R1;
- } else if (DRF_D == U) { R3D1R1D2R3D3R1;
- }
- goto cornerDone;
- URB4: if (DRB_R == U) { R1D1R3;
- } else if (DRB_B == U) { B3D3B1;
- } else if (DRB_D == U) { B3D1B1D2B3D3B1;
- }
- goto cornerDone;
- ULB4: if (DLB_B == U) { B1D1B3;
- } else if (DLB_L == U) { L3D3L1;
- } else if (DLB_D == U) { L3D1L1D2L3D3L1;
- }
- goto cornerDone;
- ULF4: if (DLF_L == U) { L1D1L3;
- } else if (DLF_F == U) { F3D3F1;
- } else if (DLF_D == U) { F3D1F1D2F3D3F1;
- }
- cornerDone: ;
- /*
- * Exit if all 4 of the corner cubes in the top row are in
- * the correct position and orientation.
- */
- if (ULF_U==U && URF_U==U && ULB_U==U && URB_U==U &&
- ULF_F==F && URF_F==F && URF_R==R && URB_R==R &&
- ULB_B==B && URB_B==B && ULF_L==L && ULB_L==L)
- break;
- /*
- * Move an incorrectly oriented corner cube in the top row
- * down into the bottom row
- */
- if ((URF_U == U || URF_F == U || URF_R == U) &&
- (URF_U != U || URF_F != F || URF_R != R)) {
- R3D1R1;
- } else if ((URB_U == U || URB_R == U || URB_B == U) &&
- (URB_U != U || URB_R != R || URB_B != B)) {
- B3D1B1;
- } else if ((ULB_U == U || ULB_B == U || ULB_L == U) &&
- (ULB_U != U || ULB_B != B || ULB_L != L)) {
- L3D1L1;
- } else if ((ULF_U == U || ULF_L == U || ULF_F == U) &&
- (ULF_U != U || ULF_L != L || ULF_F != F)) {
- F3D1F1;
- }
- } while (true);
- return (true);
- }